<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="zh" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="DC.Type" content="concept"/>
<meta name="DC.Title" content="Lucene的索引文件格式"/>
<meta name="DC.subject" content="Apache, Lucene, 指南, OSSEZ, OSS 计算技术"/>
<meta name="keywords" content="Apache, Lucene, 指南, OSSEZ, OSS 计算技术"/>
<meta name="DC.Relation" scheme="URI" content="../../tasks/chapter02/chapter02.html"/>
<meta name="prodname" content="Lucene 指南"/>
<meta name="version" content="1.0.0.0"/>
<meta name="brand" content="OSSEZ APACHE LUCENE"/>
<meta name="copyright" content="OSSEZ (中国) 信息技术有限公司 2006, 2012" type="primary"/>
<meta name="DC.Rights.Owner" content="OSSEZ (中国) 信息技术有限公司 2006, 2012" type="primary"/>
<meta name="DC.Format" content="XHTML"/>
<meta name="DC.Identifier" content="chapter01"/>
<meta name="DC.Language" content="zh"/>
<link rel="stylesheet" type="text/css" href="../../css/commonltr.css"/>
<link rel="stylesheet" type="text/css" href="../../css/public.css"/>
<title>Lucene的索引文件格式</title>
<svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/constants.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/diagram.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/sequence.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/loop.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/decision.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/revdecision.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/boxed.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/unboxed.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/text.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/void.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/notecontainer.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/note.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/main.js"/><link rel="stylesheet" type="text/css" href="css/syntaxdiagram.css"/></head>
<body id="chapter01">


  <h1 class="title topictitle1">Lucene的索引文件格式</h1>

  
  <div class="body conbody">
    <p class="p">Lucene 的索引里面存了些什么，如何存放的，也即Lucene 的索引文件格式，是读懂 Lucene 源代码的一把钥匙。</p>

    <p class="p">当我们真正进入到 Lucene 源代码之中的时候，我们会发现:</p>

    <div class="p"><ul class="ul">
        <li class="li">Lucene 的索引过程，就是按照全文检索的基本过程，将倒排表写成此文件格式的过程。</li>

        <li class="li">Lucene 的搜索过程，就是按照此文件格式将索引进去的信息读出来，然后计算每篇文档打分(score)的过程。</li>

      </ul>
</div>

    <p class="p">Lucene 的索引结构是有层次结构的，主要分以下几个层次：</p>

    <div class="p"><ul class="ul">
        <li class="li">
          <p class="p">索引(Index)：</p>

          <p class="p">索引(Index)：在 Lucene 中一个索引是放在一个文件夹中的。</p>

          <p class="p">同一文件夹中的所有的文件构成一个Lucene 索引。</p>

        </li>

        <li class="li">
          <p class="p">段(Segment)：</p>

          <p class="p">一个索引可以包含多个段，段与段之间是独立的，添加新文档可以生成新的段，不同的段可以合并。</p>

          <p class="p">具有相同前缀文件的属同一个段，段可以有下面的前缀，如两个段 "_0" 和 "_1"。</p>

          <p class="p">segments.gen 和segments_5 是段的元数据文件，也即它们保存了段的属性信息。</p>

        </li>

        <li class="li">
          <p class="p">文档(Document)：</p>

          <p class="p">文档是我们建索引的基本单位，不同的文档是保存在不同的段中的，一个段可以包含多篇文档。</p>

          <p class="p">新添加的文档是单独保存在一个新生成的段中，随着段的合并，不同的文档合并到同一个段中。</p>

        </li>

        <li class="li">
          <p class="p">域(Field)：</p>

          <p class="p">一篇文档包含不同类型的信息，可以分开索引，比如标题，时间，正文，作者等，都可以保存在不同的域里。</p>

          <p class="p">不同域的索引方式可以不同。</p>

        </li>

        <li class="li">
          <p class="p">词(Term)：</p>

          <p class="p">词是索引的最小单位，是经过词法分析和语言处理后的字符串。</p>

        </li>

      </ul>
</div>

    <p class="p">Lucene 的索引结构中，即保存了正向信息，也保存了反向信息。</p>

    <p class="p">所谓正向信息：</p>

    <div class="p"><ul class="ul">
        <li class="li">按层次保存了从索引，一直到词的包含关系：索引(Index) –&gt; 段(segment) –&gt; 文档 (Document) –&gt; 域(Field) –&gt; 词(Term)。</li>

        <li class="li">既然是层次结构，则每个层次都保存了本层次的信息以及下一层次的元信息，也即属性信息，比如一本介绍中国地理的书，应该首先介绍中国地理的概况，以及中国包含多少个省，每个省介绍本省的基本概况及包含多少个市，每个市介绍本市的基本概况及包含多少个县，每个县具体介绍每个县的具体情况。</li>

        <li class="li">包含正向信息的文件有<ol class="ol">
            <li class="li">segments_N 保存了此索引包含多少个段，每个段包含多少篇文档。</li>

            <li class="li">XXX.fnm 保存了此段包含了多少个域，每个域的名称及索引方式。</li>

            <li class="li">XXX.fdx，XXX.fdt 保存了此段包含的所有文档，每篇文档包含了多少域，每个域保存了那些信息。</li>

            <li class="li">XXX.tvx，XXX.tvd，XXX.tvf 保存了此段包含多少文档，每篇文档包含了多少域，每个域包含了多少词，每个词的字符串，位置等信息。</li>

          </ol>
</li>

      </ul>
</div>

    <p class="p">所谓反向信息：</p>

    <div class="p"><ul class="ul">
        <li class="li">
          <p class="p">保存了词典到倒排表的映射：词(Term) –&gt; 文档(Document)</p>

        </li>

        <li class="li">
          <p class="p">包含反向信息的文件有：</p>

          <div class="p"><ol class="ol">
              <li class="li">XXX.tis，XXX.tii 保存了词典(Term Dictionary)，也即此段包含的所有的词按字典顺序的排序。</li>

              <li class="li">XXX.frq 保存了倒排表，也即包含每个词的文档ID 列表。</li>

              <li class="li">XXX.prx 保存了倒排表中每个词在包含此词的文档中的位置。</li>

            </ol>
</div>

        </li>

      </ul>
</div>

    <p class="p"><a class="xref" href="http://www.ossez.com/forum.php?mod=viewthread&amp;tid=18389&amp;fromuid=426" target="_blank">http://www.ossez.com/forum.php?mod=viewthread&amp;tid=18389&amp;fromuid=426</a></p>

  </div>

<div class="related-links">
<div class="familylinks">
<div class="parentlink"><strong>父主题：</strong> <a class="link" href="../../tasks/chapter02/chapter02.html">Lucene的总体架构与代码</a></div>
</div>
</div>

</body>
</html>